/*
typeof 检测数据类型的运算符
  特点1：返回的结果是字符串，字符串中包含了对应的数据类型
    + typeof typeof typeof [1,2,3]
  特点2：typeof null -> “object”
    + typeof不能检测null
    + 检测其它六种原始值类型是没有问题的
  特点3：typeof 对象 -> “object” && typeof 函数 -> “function”
    + 无法对“对象”进行细分检测（除函数对象外）
  特点4：typeof 未被声明的变量 -> “undefined” 「不会报错」


typeof 检测的底层处理机制
  + 在计算机编程语言中（包括JS），所有的数据类型值，在计算机底层都是按照“二进制（0/1）”进行存储的
    + 操作系统是32位的，则存储的二进制值也是32位
    + 操作系统是64位的，则存储的二进制值也是64位「主流」
    + 不同数据类型的二进制值是有特点的
      对象：以000开始
      数字：整数是以1开始、浮点数(小数)是以010开始
      字符串：以100开始
      布尔：以110开始
      null：64位都是零
      undefined比较特殊，它存储的是-2^30
      ...
  + typeof 是按照计算机底层存储的二进制值，来进行检测的「优势：效率高、检测快」
    + 检测的时候，主要以开始的数字来进行判断，例如：以000开始的认为对象...
      因为null存储的都是0，前三位肯定也是0，所以被误识别为对象了
      typeof null -> “object”
    + 如果被检测出来是对象，接下来会再看：当前对象是否实现了 [[Call]]
      如果没有实现，则返回 “object”
      如果实现了，则返回 “function”
  + 但是在所有的检测之前，先看“要被检测的值”是否声明了，如果没有声明，直接返回 “undefined”


typeof在实战中的运用：
  @1 检测除null以外的原始值类型「性能高」
  @2 笼统的校验是否为对象
  @3 检测是否为函数  => isFunction
  @4 处理浏览器兼容「ES6+语法规范，都不兼容IE」
    所谓的兼容，无外乎就是：高版本浏览器有这个东西，而低版本浏览器没有这个东西（直接访问会报错 xxx is not defined）
*/
if (typeof Symbol !== 'undefined') {
  // 浏览器兼容Symbol「浏览器支持ES6+的语法」
}